/*
 * librolgps, part of the RolGPS Proyect
 *
 *   
 * Copyright (C) Pablo Alejandro Costesich <rhfixer@gmail.com>
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
 */
package databaseHandler;

import java.io.File;
import exceptions.*;
import java.sql.SQLException;

/**
 *
 * @author xeph
 *
 * Esta clase, abstracta por definición, contiene los métodos que posiblilitan el manejo
 * de una base de datos sin importar *qué* tipo de container tiene. Es decir, no discrimina
 * entre XML ó sqlite. Incluso, en un futuro podría proveer una conexión en línea a 
 * una base de datos en MySQL para las actualizaciones.
 * 
 * También se encarga de la traducción de los datos de una base de datos a otra. La clase
 * no reconoce los campos específicos (no lo necesita), sino que puede parsear un árbol
 * XML para traducirlo a SQL, o a la inversa. También permite la reutilización de archivos
 * CSV y los antiguos pertenecientes al rolgps (1).
 * 
 * Todo el código sucio concerniente a la descarga o creación de las bases de datos se 
 * encuentra aquí. Un programador de interfaz NO necesita saber qué ocurre en la 
 * librería.
 *  
 * Sin embargo, a pesar de todas sus bondades, sólo se trabaja con SQL por rapidez. Parsear
 * un archivo XML por cada búsqueda es un asesinato a la eficiencia y quien lo sugiera recibirá
 * mis visitas por la noche, donde le prenderé fuego y cortaré en tantos pedacitos como líneas
 * del archivo XML con la base de datos de personajes. Lo prometo.
 * 
 * NOTA: Por si no lo notaron hasta ahora, esta clase se encarga de "unir" los distintos motores
 * de base de datos para acceder por métodos comunes. Es por eso que los handlers NO pueden
 * accederse desde fuera del paquete. NO deben heredarse los handlers. NUNCA. Por eso son
 * instanciables y no abstractos, porque son un atajo para no llenar de miles de líneas de código
 * a este archivo.
 */
public abstract class Database {

    /*
     * Por defecto, usa el driver provisto por sqlite. Con un mínimo cambio puede portarse a mysql.
     */
    private final String ENGINE = "sqlite";
    private sqliteHandler sqlite = new sqliteHandler();
    /*
     * * * * * Métodos * * * * *
     */

    protected Object[][] executeStatement(String query) throws SQLException {
        Object[][] result = sqlite.executeStatement(query);
        return result;
    }

    protected void setDatabaseFile(File sqliteSourceFile) {
        sqlite.setSqliteSource(sqliteSourceFile.getPath());
    }

    protected File getCurrentDatabaseFile() {
        return new File(sqlite.getSqliteSource());
    }

    protected void exportTables(String... tableName) {
        //con un foreach puedo recorrer todos los índices de tableName.
        //es una copia de database por sql.
        sqlite.exportTables(tableName);
    }

    protected void exportSql(File dbName) {
        sqlite.exportSql(dbName);
    }

    protected void importXML(File xmlFileName) {

    }

    protected void importXML(File xmlFileName, String tableName) {

    }

    protected void exportXML(String tableName, File xmlFileName) {

    }

    protected void exportXML(File xmlFileName) {

    }

    protected void importCSV(File csvFileName, String tableName) {

    }

    protected void importCSV(File csvFileName) {

    }

    protected void exportCSV(String tableName, File csvFileName) {

    }

    protected void exportCSV(String tableName) {

    }

    protected void importSql(File dbName) {

    }
    
     protected String escapeSql(String escapable) {
        return sqlite.escapeField(escapable);
    }
     
     protected String escapeQuery(String escapable, String[] values) throws SQLException {
        return sqlite.escapeQuery(escapable, values);
    }
}
